package com.its.service.impl;

import com.alibaba.csp.sentinel.annotation.SentinelResource;
import com.its.client.UserServiceClient;
import com.its.pojo.Order;
import com.its.mapper.OrderMapper;
import com.its.pojo.User;
import com.its.service.OrderService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.its.util.HttpStatusEnum;
import com.its.util.Result;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.stereotype.Service;
import org.springframework.web.client.HttpClientErrorException;
import org.springframework.web.client.HttpServerErrorException;
import org.springframework.web.client.RestTemplate;

/**
 * <p>
 *  服务实现类
 * </p>
 *
 * @author 朱厚强
 * @since 2024年01月17日
 */
@Service
@Slf4j
public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements OrderService {
    @Autowired
    private OrderMapper orderMapper;
    @Autowired
    private RestTemplate restTemplate;
    @Autowired
    private DiscoveryClient discoveryClient;
    @Autowired
    private UserServiceClient userServiceClient;
    @Override
    public Result getByIds(String id) {
        Order byId = orderMapper.selectById(id);
        try {
//            // 这种是用于处理单项目的，不涉及到集群。
//            String url = null;
//            //            System.out.println("discoveryClient = " + discoveryClient);
//            // 获取具体的服务实例信息
//            List<ServiceInstance> instances = discoveryClient.getInstances("User-Service");
//            if(!(instances.isEmpty())){
//                ServiceInstance serviceInstance = instances.get(0);
//                 url = "http://"+serviceInstance.getHost()+":"+serviceInstance.getPort()+"/user/getById/" + byId.getUserId();
//            }else {
//                 url = "http://localhost:8000/user/getById/" + byId.getUserId();
//            }

            // 查询用户信息 --- > 集群时的配置、  ---》 需要特别注意的是，我原先的Result是从控制器层返回的，现在是从service层返回的。
//                    所以，这里的配置可能就不需要那么复杂了。 --》 这个有机会再测试。
//            // 构造 ParameterizedTypeReference 以保留泛型信息
//            ParameterizedTypeReference<Result<User>> responseType = new ParameterizedTypeReference<Result<User>>() {};
//
//            // 现在开始负载均衡级别的配置
//            // 加上 User-Service 是我们的实例名称，在nocos 里面存储的有。
//            /**
//             * 参数解析
//             * url: 要访问的远程服务的 URL。在你的代码中，URL 是 "http://localhost:8000/user/" + byId.getUserId()，这里拼接了用户ID。
//             * responseType: 期望的响应类型，即返回的数据将被转换为该类型的对象。在你的代码中，期望返回的是 User.class 类型的对象。
//             * uriVariables: 可选的参数，用于替换 URL 中的占位符。
//             * "http://localhost:8000/user/" + byId.getUserId(): 这是拼接出实际的远程服务的 URL。在这里，使用了 byId.getUserId() 获取订单中的用户ID，并将其拼接到 URL 中。
//             * 使用 exchange 方法发送 GET 请求获取 ResponseEntity
//             */
//            ResponseEntity<Result<User>> responseEntity = restTemplate.exchange("http://User-Service/user/getById/" + byId.getUserId(), HttpMethod.GET, null, responseType);
//
//            // 从 ResponseEntity 中获取包含泛型的 Result 对象
////            Result<User> result = responseEntity.getBody();
//
//            // 从 Result 对象中获取具体的 User 数据
//            User user = result.getData();

//            用feign 方式来远程获取到数据
            Result<User> user = userServiceClient.queryById(byId.getUserId());

            // 添加日志记录
            log.info("RestTemplate request successful. User: {}", user);
            // 处理用户信息...
            //将查询到用户添加到order中
            byId.setUser(user.getData());
        } catch (HttpClientErrorException | HttpServerErrorException e) {
            // 处理异常并添加日志记录
            log.error("异常信息为{}", e.getMessage());
        }
        if (byId != null){
            return Result.ok().code(HttpStatusEnum.SUCCESS.getCode()).data(byId).message("查询成功");
        }else {
            return Result.error().code(HttpStatusEnum.ERROR.getCode()).data(byId).message("查询失败");
        }
    }
    @SentinelResource("/goods")
    public void queryGoods(){
        System.err.println("查询商品");
    }
}
